import traceback
from models.hotspot import Hotspot
from extensions import db
from services.platform_crawl_manager import (
    get_platform_latest_crawl_at,
    set_platform_latest_crawl_at,
)
from services.constants import PLATFORM_CONFIG
from services.utils import prepare_hotspot_data
from crawlers.fxbaogao import get_reports_from_fxbaogao


def fetch_fxbaogao_hotspot_to_db(crawl_at) -> None:
    """抓取发现报告热点数据并存入数据库

    Parameters:
            crawl_at: 时间戳，用于记录抓取时间

    """
    try:
        # 获取发现报告日榜数据
        daily_reports, weekly_reports, monthly_reports = get_reports_from_fxbaogao()

        new_daily_reports = prepare_hotspot_data(daily_reports, "发现报告", "日榜", crawl_at)

        new_weekly_reports = prepare_hotspot_data(weekly_reports, "发现报告", "周榜", crawl_at)

        new_monthly_reports = prepare_hotspot_data(monthly_reports, "发现报告", "月榜", crawl_at)

        new_reports = [*new_daily_reports, *new_weekly_reports, *new_monthly_reports]
        # 批量插入数据到数据库
        if new_reports:
            db.session.bulk_insert_mappings(Hotspot, new_reports)
            db.session.commit()

        # 更新平台最新抓取时间
        set_platform_latest_crawl_at("发现报告", crawl_at)

        print("发现报告热榜数据抓取并存入数据库成功")

    except Exception as e:
        db.session.rollback()
        print("发现报告日榜数据抓取并存入数据库失败:", e)
        print("详细错误信息:")
        traceback.print_exc()
        raise e


def get_daily_fxbaogao_hotspot_from_db() -> list:
    """从数据库获取发现报告日榜数据

    Parameters:
            crawl_at: 时间戳，用于记录抓取时间

    Returns:
            发现报告日榜数据列表
    """
    try:
        # 获取最新抓取时间
        latest_crawl_at = get_platform_latest_crawl_at("发现报告")

        # 从数据库获取日榜数据
        fxbaogao_hotspots = Hotspot.query.filter_by(
            platform=PLATFORM_CONFIG["发现报告"]["id"],
            section=PLATFORM_CONFIG["发现报告"]["sections"]["日榜"],
            crawl_at=latest_crawl_at,
        ).all()

        return fxbaogao_hotspots

    except Exception as e:
        print("从数据库中获取发现报告日榜数据失败:", e)
        print("详细错误信息:")
        traceback.print_exc()
        raise e


def get_weekly_fxbaogao_hotspot_from_db() -> list:
    """从数据库获取发现报告周榜数据

    Parameters:
            crawl_at: 时间戳，用于记录抓取时间

    Returns:
            发现报告周榜数据列表
    """
    try:
        # 获取最新抓取时间
        latest_crawl_at = get_platform_latest_crawl_at("发现报告")

        # 从数据库获取周榜数据
        fxbaogao_hotspots = Hotspot.query.filter_by(
            platform=PLATFORM_CONFIG["发现报告"]["id"],
            section=PLATFORM_CONFIG["发现报告"]["sections"]["周榜"],
            crawl_at=latest_crawl_at,
        ).all()

        return fxbaogao_hotspots

    except Exception as e:
        print("从数据库中获取发现报告周榜数据失败:", e)
        print("详细错误信息:")
        traceback.print_exc()
        raise e


def get_monthly_fxbaogao_hotspot_from_db() -> list:
    """从数据库获取发现报告月榜数据

    Parameters:
            crawl_at: 时间戳，用于记录抓取时间

    Returns:
            发现报告月榜数据列表
    """
    try:
        # 获取最新抓取时间
        latest_crawl_at = get_platform_latest_crawl_at("发现报告")

        # 从数据库获取月榜数据
        fxbaogao_hotspots = Hotspot.query.filter_by(
            platform=PLATFORM_CONFIG["发现报告"]["id"],
            section=PLATFORM_CONFIG["发现报告"]["sections"]["月榜"],
            crawl_at=latest_crawl_at,
        ).all()

        return fxbaogao_hotspots

    except Exception as e:
        print("从数据库中获取发现报告月榜数据失败:", e)
        print("详细错误信息:")
        traceback.print_exc()
        raise e
